home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / linux / idr.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  2KB  |  79 lines

  1. /*
  2.  * include/linux/idr.h
  3.  * 
  4.  * 2002-10-18  written by Jim Houston jim.houston@ccur.com
  5.  *    Copyright (C) 2002 by Concurrent Computer Corporation
  6.  *    Distributed under the GNU GPL license version 2.
  7.  *
  8.  * Small id to pointer translation service avoiding fixed sized
  9.  * tables.
  10.  */
  11. #include <linux/types.h>
  12. #include <linux/bitops.h>
  13.  
  14. #if BITS_PER_LONG == 32
  15. # define IDR_BITS 5
  16. # define IDR_FULL 0xfffffffful
  17. /* We can only use two of the bits in the top level because there is
  18.    only one possible bit in the top level (5 bits * 7 levels = 35
  19.    bits, but you only use 31 bits in the id). */
  20. # define TOP_LEVEL_FULL (IDR_FULL >> 30)
  21. #elif BITS_PER_LONG == 64
  22. # define IDR_BITS 6
  23. # define IDR_FULL 0xfffffffffffffffful
  24. /* We can only use two of the bits in the top level because there is
  25.    only one possible bit in the top level (6 bits * 6 levels = 36
  26.    bits, but you only use 31 bits in the id). */
  27. # define TOP_LEVEL_FULL (IDR_FULL >> 62)
  28. #else
  29. # error "BITS_PER_LONG is not 32 or 64"
  30. #endif
  31.  
  32. #define IDR_SIZE (1 << IDR_BITS)
  33. #define IDR_MASK ((1 << IDR_BITS)-1)
  34.  
  35. #define MAX_ID_SHIFT (sizeof(int)*8 - 1)
  36. #define MAX_ID_BIT (1U << MAX_ID_SHIFT)
  37. #define MAX_ID_MASK (MAX_ID_BIT - 1)
  38.  
  39. /* Leave the possibility of an incomplete final layer */
  40. #define MAX_LEVEL (MAX_ID_SHIFT + IDR_BITS - 1) / IDR_BITS
  41.  
  42. /* Number of id_layer structs to leave in free list */
  43. #define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL
  44.  
  45. struct idr_layer {
  46.     unsigned long         bitmap; /* A zero bit means "space here" */
  47.     struct idr_layer    *ary[1<<IDR_BITS];
  48.     int             count;     /* When zero, we can release it */
  49. };
  50.  
  51. struct idr {
  52.     struct idr_layer *top;
  53.     struct idr_layer *id_free;
  54.     int          layers;
  55.     int          id_free_cnt;
  56.     spinlock_t      lock;
  57. };
  58.  
  59. #define IDR_INIT(name)                        \
  60. {                                \
  61.     .top        = NULL,                    \
  62.     .id_free    = NULL,                    \
  63.     .layers     = 0,                    \
  64.     .id_free_cnt    = 0,                    \
  65.     .lock        = SPIN_LOCK_UNLOCKED,            \
  66. }
  67. #define DEFINE_IDR(name)    struct idr name = IDR_INIT(name)
  68.  
  69. /*
  70.  * This is what we export.
  71.  */
  72.  
  73. void *idr_find(struct idr *idp, int id);
  74. int idr_pre_get(struct idr *idp, unsigned gfp_mask);
  75. int idr_get_new(struct idr *idp, void *ptr, int *id);
  76. int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
  77. void idr_remove(struct idr *idp, int id);
  78. void idr_init(struct idr *idp);
  79.